# -*- coding:utf-8 -*-
"""
@Time:  2024/6/21 10:57
@Auth:  Mrs.Gou 
@Function:  类的相关用法
"""


# from class07 import demo05

# 类和对象区别：
# 类是抽象的，描述的是一类事物共性
# 对象是具体的，描述的是某一个的实体的具体信息

# 类和实例：
# 类函数、类变量、描述和操作整个类的属性和功能
# 实例函数、实例变量、描述和操作实例个性化属性和功能

# self代表实例本身，调用的时候不用传
# cls 代表类本身，调用的时候不用传
class HuMan:
    """
    类使用class关键字定义
    类名推荐是驼峰或者双驼峰，只要符合变量的命名规则都是可以的"""
    # 类变量，存储整个类共同的属性
    type = '人类'

    def __init__(self, name: str):
        """
        这是构造函数
        每个类都有构造方法，如果没有显示的定义构造方法，在运行的时候将会为该类提供一个默认构造方法
        """
        # 实例变量：存储个性化数据
        # 推荐实例变量在构造函数里面定义
        self.money = 0
        self.name = name
        self.__spouse = None
        # print(demo05.my_count)

    # 实例函数
    def make_money(self, m):
        """赚钱"""
        self.money += m

    def cost_money(self, m):
        """花钱"""
        self.money -= m

    def __my_spouse(self, n):
        """配偶"""
        self.__spouse = n

    # 类函数
    @classmethod
    def set_type(cls, t):
        cls.type = t


if __name__ == '__main__':
    #  # 描述文档
    # print(HuMan.__doc__)

    # 类创建对象，使用类名()调用构造函数创建对象
    will = HuMan('will')
    mayun = HuMan('mayun')

    # # 实例变量尽量在实例和实例函数中使用 （不推荐：print(HuMan.name)）
    # print(will.name)
    #
    # # 类变量通常不作为实例变量使用，只在类方法中使用 (不推荐：print(will.type))
    # print(HuMan.type)
    #
    # # # 不推荐在类外面定义实例变量
    # # will.s = 'a'
    # # print(will.s)
    #
    # will.cost_money(10)
    # print(will.money)

    # 类变量为所有实例共享（类变量用类调用）
    # 通过类名调用类方法
    # HuMan.set_type('男人')
    # print(will.type)
    # print(mayun.type)


    # 实例变量，是每个人特有的（实例变量用实例变量调用）
    # will.money = 100
    # print(will.money)
    # print(mayun.money)

    # # 运行的过程中，为HuMan添加了一个类变量（而只有实例变量不存在money这个变量的时候，才能调用到类变量
    # HuMan.money = 100
    # print(will.money)
    # print(mayun.money)


